Skip to main content

08 - 两个大厂实现拆解

前置0204 篇的写入 / 时间 / 读取三条链路,05 篇的文件式形态。

本篇回答:把前七篇的框架套到两个真实实现上,看它们各自在哪一步做了不一样的选择、代价落在哪里、以及有哪些问题两家都没解决。

为什么是这两个:不是因为 star 高。是因为它们在同一个问题上给出了方向相反的答案,放在一起看比单看任何一个都清楚。

本篇会用到的词

意思
目录递归检索先用向量定位到最相关的目录,再逐层下钻,而不是把全部条目拍平成一个列表去排序
记忆资产腾讯的抽象:对话记忆、技能、文档 Wiki、代码图都被注册成同一类可管理对象
装备(loadout)把某个记忆资产绑定给某个 Agent。类比是给角色配装备,而不是给全体发广播
三级 ACLprivate / team / restricted 三档可见性,第三档再按用户、角色、Agent 精确授权
影响面分析改一个代码符号之前,先查出哪些地方会被这次改动波及

一、两者在这个专题的坐标系里站在哪

两者都叫「记忆」,但要解决的根本不是同一个问题字节 · OpenViking面向单个 Agent 的上下文要回答:这一步该读哪些、读多深核心矛盾:资料一多,模型就不知道该翻哪一份给出的答案:把一切变成带摘要的文件树,逐层下钻对应本专题:02 篇写入、04 篇读取、05 篇文件式腾讯 · TencentDB Agent Memory面向一个团队的记忆资产要回答:这份记忆归谁、装给哪个 Agent核心矛盾:经验留在个人��那里,换个人换个 Agent 就没了给出的答案:把记忆变成有主、有版本、可授权的资产对应本专题:01 篇分型、04 篇强制注入、07 篇租户隔离选型时先分清你卡在哪一边。卡在「读不对」那边上腾讯那套是杀鸡用牛刀,卡在「经验共享不了」那边上 OpenViking 补不上治理这块。
这个差异一路贯穿到实现细节。下面每一节的对照,本质上都是这一条的推论。

二、同一个词「层」,两种完全不同的含义

两家都说自己做了分层,也都用 L0 / L1 / L2 这套编号 —— 但指的是两回事。这是读这两份文档时最容易串的地方。

同样是 L0 L1 L2 的编号,一个是「同一份东西的详略」,一个是「四份不同的东西」OpenViking:详略分层 —— 一份内容,三种粒度L0约 100 token · 一句话摘要,只判断相关不相关L1约 2K · 结构与要点,够拿来做计划L2  全文,只在真要读时才加载三条指向同一份资料。删掉 L0 不会丢信息,只是判断成本变高关键:每个「目录」自己也有 L0/L1,所以不打开就能筛腾讯:提炼分层 —— 四份不同的东西L0 对话原文L1 事实偏好·约束L2 场景项目知识块L3 画像长期模式异步管线逐层提炼,越往右越稳定、越少变删掉 L1 会真的丢信息 —— 它是从 L0 抽出来的,不是 L0 的缩写取的时候方向相反:先用 L2/L3 铺底,要具体事实才回落 L1/L0这条回落路径就是 02 篇说的「抽取式 + 原样存两条都留」
差别有实际后果:OpenViking 的 L0 丢了可以重算(它是 L2 的摘要);腾讯的 L1 丢了不能从 L2 重建(L2 是从 L1 汇总的,方向是反的)。备份和迁移策略因此完全不同。

为什么腾讯那套的方向值得注意02 篇第一节讲过抽取式和原样存两条路线的取舍 —— 抽取省地方但会丢信息,原样存不丢但检索时命中的不是答案本身。腾讯的做法是两条都留:L0 保原文用于核对措辞、时间戳和出处,L1 保抽出来的事实用于精确召回。这是把那道取舍题换成了存储成本题。

三、案例 A:OpenViking —— 把上下文当数据库

3.1 数据模型

一切挂在 viking:// 下,只有三类:

viking://
├── resources/ # 资源:项目文档、代码仓、网页
│ └── my_project/
└── user/{user_id}/
├── memories/preferences/ # 记忆:抽取出来的用户偏好
├── resources/ # 该用户私有的资源
├── skills/ # 技能
└── peers/ # 其他参与者

这个模型的取舍很清楚:牺牲表达力换确定性。它没有 03 篇那套时间字段,也没有图边 —— 换来的是 Agent 可以用 ls / tree / find 确定性地定位内容,而不是把查询丢进一个黑盒里等结果。

多租户隔离靠 user/{user_id}/ 这棵子树,结构上比 02 篇第七节说的"可选 filter 漏传就越界"更难出事。

3.2 检索:递归下钻,不是一次拍平

同一个查询,两种检索结构给出的东西不一样常规做法:一次拍平全部条目排成一个列表,向量打分取前 k 条命中:某文件第 340 行周边上下文没了这一段属于哪个模块、上下文是什么,模型看不到结果不对时也说不清为什么是它OpenViking:目录递归下钻① 定位目录② 读 L0/L1③ 加载 L2命中结果自带它所在目录的结构与要点每一步判断都在几百 token 上做,不是几万下钻轨迹被保留,结果不对能看出是哪一层走偏
右边那条"轨迹可回放"是这套设计里最容易被低估的部分。04 篇第七节说过,排查记忆问题的前提是能看到读回了什么;把检索路径本身留下来,比事后往 trace 里补属性更彻底。

3.3 它没解决什么

前面篇目里的问题OpenViking 的状态
事实变了怎么办(03 篇没有双时间轴,也没有作废语义。改了就是覆盖,问不了"三月份时是什么情况"
强制注入安全类记忆(04 篇第四节)做不到。模型不去下钻就读不到,和 memory 工具一样是提示词层面的约束
许可证AGPL-3.0crates/ov_cliexamples 单独 Apache-2.0)。记忆层几乎总以服务形态部署,网络分发条款会被触发
自报评测README 给的是"接上前后"的对比(某客户端在 LoCoMo 上 24.20% → 82.08%),基线是各客户端原生表现、嵌入模型是自家的 —— 按 07 篇第四节那套读法,这类数字说明不了它和别的记忆库谁强

四、案例 B:腾讯 —— 把记忆当团队资产

4.1 四类资产,同一套治理

它把四样东西注册成同一类对象:

资产装的是什么对应 01 篇的分型
Chat Memory偏好、事实、决策、交互历史语义记忆 + 情景记忆
Skill可复用的做法。带版本、资源文件、触发边界、执行步骤、校验规则程序记忆
Wiki文档变成带链接图的结构化页面不属于记忆,是 RAG 语料
CodeGraph代码符号、文件、调用关系、影响面同上

Skill 那一行值得停一下01 篇3.2 说过程序记忆最危险 —— 它改的是行为,且没有任何一轮对话会去纠正它,所以必须配版本管理和回归评测。腾讯这套把版本、触发边界、校验规则做进了 Skill 的结构里,是目前公开实现里唯一正面处理这个问题的。默认私有、审核后才能共享给团队,也是同一个考虑。

后两行严格说不是记忆,是 01 篇第二节划给 RAG 的东西。把它们和记忆放进同一套治理里是产品决策,不是概念混淆 —— 因为"谁能看""哪个版本有效""装给哪个 Agent"这三个问题对四者是共通的。

4.2 强制注入:这批里唯一有现成机制的

04 篇第四节留了一个问题:过敏源、禁忌药物这类记忆不能丢进向量检索里跟别的条目竞争排名,但没有任何一个开源实现提供现成机制。腾讯这套是例外。

两条通路:一条绕过排序,一条参与排序 —— 差别就是 04 篇要的那个「强制注入」全部记忆资产Chat Memory · SkillWiki · CodeGraph① 先收窄权限范围private / team / restricted / agent按用户 · 角色 · Agent 精确授权② 固定绑定的资产无条件进上下文,不参与排序② 其余资产按当前�查询检索排序这个 Agent 的上下文三重上限兜底三重上限:条数 · 字符预算 · 超时这三个是防「记忆撑爆上下文」的最后一道闸 —— 对应上下文工程专题里的召回预算。没有它,权限做得再细也挡不住一次异常膨胀。可以对着 07 篇第三节那张跨租户失守表看:这套把「漏传一个 filter 就退化成全库检索」的风险,换成了「资产默认私有、共享是显式动作」。默认值的方向反过来了 —— 前者默认放开、要靠调用方收紧,后者默认收紧、要靠人显式放开。
「共享是显式动作,不是默认泄漏」这句 README 原话,说的正是 07 篇第三节那三处失守点的根因:默认值定错了方向。命名空间写成 ("memories",) 也好、filters 漏传也好,都是「默认全局、靠调用方收紧」这一种设计的产物。

4.3 它没解决什么

前面篇目里的问题腾讯这套的状态
事实变了怎么办(03 篇同样没有双时间轴。靠 L0→L3 的分层重算来覆盖旧结论,答不了"当时系统以为是什么"
部署成本四个服务(MemoryCore / MemoryKnowledge / MemoryPanel / MemoryProxy)+ 数据库。是06 篇部署重量里最重的一档
异步延迟Wiki 与 CodeGraph 是异步构建的,要等状态变成 ready;对话也要等异步管线提炼完才有 L1 以上
私有仓支持CodeGraph 目前优先支持公开 HTTPS 仓库,私有仓和 SSH 凭证还在完善
自动路由资产绑定目前是人工的,全自动记忆路由还在迭代
自报评测PersonaMem 从 48% 到 76%,同样是"接上前后"的对比,不是与其他记忆库的横向比

五、两者对照

维度字节 OpenViking腾讯 Agent Memory
统一抽象虚拟文件系统 viking://记忆资产 Memory Asset
「层」的含义同一份内容的三种详略四种不同的东西,逐层提炼
检索方式目录递归下钻,轨迹可回放分层召回,L2/L3 铺底后回落 L1/L0
混合检索向量为主BM25 + 向量 + RRF
强制注入✅ 固定绑定
多租户user/{user_id}/ 子树团队 / 用户 / Agent 三级 ACL + 四档可见性
程序记忆skills 目录,无版本治理Skill 带版本、触发边界、校验规则、审核流
人的角色看轨迹排查审核、共享、装备
部署独立 HTTP 服务,自带 compose 与 helm四个服务 + 数据库
许可证AGPL-3.0MIT
语言Rust + PythonTypeScript

一句话选型:卡在"资料多了 Agent 读不对"上,看 OpenViking;卡在"经验留在个人那儿传不下去、且要控制谁看得到什么"上,看腾讯那套。前者是上下文问题,后者是组织问题。

六、两家都没解决的三件事

这三条不是这两家的疏忽,是整个领域目前的状态① 时间维度是空的都没有双时间轴与作废语义新的覆盖旧的,历史查不回来要回溯就得自己加一层或者用 Graphiti(03 篇)② 迁不走一个是文件树,一个是四层资产两两之间没有无损转换选定即长期绑定自己留薄接口是唯一解③ 数字不可比都只给「接上前后」的对比基线是原生表现,不是别家嵌入模型也各用各的只能自己按 07 篇第五节测
第①条尤其值得注意:两家都在时间维度上留白,而 03 篇那些场景(用户搬家、负责人换人、方案改版)在真实业务里非常常见。这说明"事实会变"这件事在工程实现上仍然被系统性低估。

七、能抄走的四条设计

不打算用这两个产品,这四条也值得抄进自建方案:

  1. 元数据和内容一起生成,不要手写。OpenViking 让每个目录都有 .abstract.overview,随内容一起更新。手写在提示词里的那种文件说明,迟早和内容对不上
  2. 权限的默认值要收紧,不要放开。腾讯的资产默认私有、共享是显式动作。07 篇第三节那三处跨租户失守,根因都是"默认全局、靠调用方收紧"
  3. 给检索留一条不参与排序的旁路。安全类记忆走固定绑定式的无条件注入,其余才去竞争排名
  4. 原文和抽取结果都留。腾讯的 L0 保原文、L1 保事实,把02 篇那道"抽取还是原样存"的取舍题换成了存储成本题 —— 存储比模型调用便宜得多

八、小结

  • 两者都叫记忆,解决的问题不同:OpenViking 面向单个 Agent 的上下文,腾讯面向团队的记忆资产
  • 「层」这个词在两家的含义完全不同:一个是同一份内容的详略,一个是四份不同的东西。备份与迁移策略因此不同
  • 腾讯那套是目前唯一自带强制注入机制(固定绑定)和程序记忆版本治理(Skill)的公开实现
  • OpenViking 的检索轨迹可回放,比事后往 trace 里补属性更彻底
  • 两家都没做时间维度:没有双时间轴、没有作废语义,历史查不回来
  • 两家的自报评测都是"接上前后"的对比,不能用来横向比较

← 回到 专题索引 | Agent Infra 板块总览